function fitness_history = GAPSO(n_particles, n_variables, max_iter, lb, ub, fun)
    %% 参数初始化
lenchrom=n_variables;    %字符串长度（个体长度），染色体编码长度
pc=0.7;        %设置交叉概率，本例中交叉概率是定值，若想设置变化的交叉概率可用表达式表示，或从写一个交叉概率函数，例如用神经网络训练得到的值作为交叉概率
pm=0.3;        %设置变异概率，同理也可设置为变化的

%粒子群算法中的两个参数
c1 = 1.49445;
c2 = 1.49445;

maxgen=max_iter;   % 进化次数  
popsize=n_particles; %种群规模

%粒子更新速度
Vmax=1;
Vmin=-1;

%种群
popmax=ub;
popmin=lb;

% 变量取值范围
%   bound = ones(n_variables, popmin);
bound = [popmin* ones(n_variables, 1), popmax* ones(n_variables, 1)];
%bound=[popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax];  %变量范围

% 优化粒子数目
par_num=n_variables;

%% 产生初始粒子和速度
for i=1:popsize
    %随机产生一个种群
    pop(i,:)=popmax*rand(1,par_num);    %初始种群
    V(i,:)=rand(1,par_num);  %初始化速度
    %计算适应度
    fitness(i)=fun(pop(i,:));   %染色体的适应度
end

%找最好的染色体
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:);   %全局最佳
gbest=pop;    %个体最佳
fitnessgbest=fitness;   %个体最佳适应度值
fitnesszbest=bestfitness;   %全局最佳适应度值

%% 迭代寻优
for i=1:maxgen
    for j=1:popsize
        
        %速度更新 PSO选择更新
        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
        V(j,find(V(j,:)>Vmax))=Vmax;
        V(j,find(V(j,:)<Vmin))=Vmin;
        
        %种群更新 PSO选择更新
        pop(j,:)=pop(j,:)+0.5*V(j,:);
        pop(j,find(pop(j,:)>popmax))=popmax;
        pop(j,find(pop(j,:)<popmin))=popmin;
        
        % 交叉操作 GA
        GApop=Cross(pc,lenchrom,pop,popsize,bound);
        
        % 变异操作 GA变异
        GApop=Mutation(pm,lenchrom,GApop,popsize,[i maxgen],bound);
        
        pop=GApop; % GA pop --> PSO pop
      
        % 适应度值 --> 约束条件
        fitness(j)=fun(pop(j,:));

        %个体最优更新
        if fitness(j) < fitnessgbest(j)
            gbest(j,:) = pop(j,:);
            fitnessgbest(j) = fitness(j);
        end
        
        %群体最优更新
        if fitness(j) < fitnesszbest
            zbest = pop(j,:);
            fitnesszbest = fitness(j);
        end
        
    end
    
    fitness_history(i)=fitnesszbest;     
end
end